logo头像
Snippet 博客主题

RxSwift - 学习笔记三

除了 Observable,RxSwift 还为我们提供了一些特征序列(Traits):Single、Completable、Maybe、Driver、ControlEvent。
我们可以将这些 Traits 看作是 Observable 的另外一个版本。它们之间的区别是:
Observable 是能够用于任何上下文环境的通用序列。
而 Traits 可以帮助我们更准确的描述序列。同时它们还为我们提供上下文含义、语法糖,让我们能够用更加优雅的方式书写代码

  • Single
    Single 是 Observable 的另外一个版本。但它不像 Observable 可以发出多个元素,它要么只能发出一个元素,要么产生一个 error 事件。

    发出一个元素,或一个 error 事件
    不会共享状态变化

  • SingleEvent
    为方便使用,RxSwift 还为 Single 订阅提供了一个枚举(SingleEvent)

    .success:里面包含该 Single 的一个元素值
    .error:用于包含错误

    1
    2
    3
    4
    public enum SingleEvent<Element> {
    case success(Element)
    case error(Swift.Error)
    }
  • asSingle()
    我们可以通过调用 Observable 序列的 .asSingle() 方法,将它转换为 Single。

  • Completable
    Completable 是 Observable 的另外一个版本。不像 Observable 可以发出多个元素,它要么只能产生一个 completed 事件,要么产生一个 error 事件。

    不会发出任何元素
    只会发出一个 completed 事件或者一个 error 事件
    不会共享状态变化

  • CompletableEvent
    为方便使用,RxSwift 为 Completable 订阅提供了一个枚举(CompletableEvent):

    .completed:用于产生完成事件
    .error:用于产生一个错误

    1
    2
    3
    4
    public enum CompletableEvent {
    case error(Swift.Error)
    case completed
    }
  • Maybe
    Maybe 同样是 Observable 的另外一个版本。它介于 Single 和 Completable 之间,它要么只能发出一个元素,要么产生一个 completed 事件,要么产生一个 error 事件

    发出一个元素、或者一个 completed 事件、或者一个 error 事件
    不会共享状态变化

  • MaybeEvent
    为方便使用,RxSwift 为 Maybe 订阅提供了一个枚举(MaybeEvent)

    .success:里包含该 Maybe 的一个元素值
    .completed:用于产生完成事件
    .error:用于产生一个错误

    1
    2
    3
    4
    5
    public enum MaybeEvent<Element> {
    case success(Element)
    case error(Swift.Error)
    case completed
    }
  • asMaybe()
    我们可以通过调用 Observable 序列的 .asMaybe() 方法,将它转换为 Maybe。

  • Driver
    (1)Driver 可以说是最复杂的 trait,它的目标是提供一种简便的方式在 UI 层编写响应式代码。
    (2)如果我们的序列满足如下特征,就可以使用它:

    不会产生 error 事件
    一定在主线程监听(MainScheduler)
    共享状态变化(shareReplayLatestWhileConnected)

为什么要使用 Driver?
(1)Driver 最常使用的场景应该就是需要用序列来驱动应用程序的情况了,比如:
通过 CoreData 模型驱动 UI
使用一个 UI 元素值(绑定)来驱动另一个 UI 元素值
(2)与普通的操作系统驱动程序一样,如果出现序列错误,应用程序将停止响应用户输入。
(3)在主线程上观察到这些元素也是极其重要的,因为 UI 元素和应用程序逻辑通常不是线程安全的。
(4)此外,使用构建 Driver 的可观察的序列,它是共享状态变化

  • ControlProperty
    (1)ControlProperty 是专门用来描述 UI 控件属性,拥有该类型的属性都是被观察者(Observable)。
    (2)ControlProperty 具有以下特征:

    不会产生 error 事件
    一定在 MainScheduler 订阅(主线程订阅)
    一定在 MainScheduler 监听(主线程监听)
    共享状态变化

  • ControlEvent
    1)ControlEvent 是专门用于描述 UI 所产生的事件,拥有该类型的属性都是被观察者(Observable)。
    (2)ControlEvent 和 ControlProperty 一样,都具有以下特征:

    不会产生 error 事件
    一定在 MainScheduler 订阅(主线程订阅)
    一定在 MainScheduler 监听(主线程监听)
    共享状态变化

    1
    2
    3
    4
    5
    6
    7
    8
    import RxSwift
    import UIKit

    extension Reactive where Base: UIButton {
    public var tap: ControlEvent<Void> {
    return controlEvent(.touchUpInside)
    }
    }
  • Schedulers
    调度器(Schedulers)是 RxSwift 实现多线程的核心模块,它主要用于控制任务在哪个线程或队列运行。

(2)RxSwift 内置了如下几种 Scheduler:

CurrentThreadScheduler:表示当前线程 Scheduler。(默认使用这个)
MainScheduler:表示主线程。如果我们需要执行一些和 UI 相关的任务,就需要切换到该 Scheduler 运行。
SerialDispatchQueueScheduler:封装了 GCD 的串行队列。如果我们需要执行一些串行任务,可以切换到这个 Scheduler 运行。
ConcurrentDispatchQueueScheduler:封装了 GCD 的并行队列。如果我们需要执行一些并发任务,可以切换到这个 Scheduler 运行。
OperationQueueScheduler:封装了 NSOperationQueue。

  • subscribeOn()
    该方法决定数据序列的构建函数在哪个 Scheduler 上运行
  • observeOn()
    该方法决定在哪个 Scheduler 上监听这个数据序列。
微信打赏

赞赏是不耍流氓的鼓励